#include <iostream>
#include <unistd.h>
#include <signal.h>

using namespace std;

void showPending(sigset_t *pending)
{
    for (int sig = 31; sig >= 1; sig--)
    {
        if (sigismember(pending, sig))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

void handler(int signum)
{
    cout << "获取了一个信号： " << signum << endl;

    sigset_t pending;
    int c = 5;
    while (c--)
    {
        sigpending(&pending);
        showPending(&pending);
        sleep(1);
    }
}

/*
struct sigaction
{
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
};
*/

int main()
{
    // signal(2, SIG_IGN); 测试：设置2号信号的处理函数为忽略 则oldact.sa_handler即为1
    cout << "getpid: " << getpid() << endl;

    // sigaction是内核数据类型 act, oldact是在用户栈定义的
    struct sigaction act, oldact;
    // 初始化
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    
    //int sigaddset(sigset_t *__set, int __signo)
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);
    sigaddset(&act.sa_mask, 6);
    sigaddset(&act.sa_mask, 7);

    // 设置进当前调用进程的pcb中
    sigaction(2, &act, &oldact); // 设置2号信号的处理函数为act.sa_handler

    cout << "default action : " << (int)(oldact.sa_handler) << endl;

    while (true)
        sleep(1);
    return 0;
}